/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright 2006 - 2009 Pentaho Corporation. All rights reserved.
*
*/
package org.pentaho.platform.plugin.action.jfreereport;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.activation.DataSource;
import javax.print.DocFlavor;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.swing.table.TableModel;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jfree.ui.RefineryUtilities;
import org.pentaho.actionsequence.dom.ActionInput;
import org.pentaho.actionsequence.dom.ActionResource;
import org.pentaho.actionsequence.dom.IActionInput;
import org.pentaho.actionsequence.dom.IActionOutput;
import org.pentaho.actionsequence.dom.IActionResource;
import org.pentaho.actionsequence.dom.actions.ActionDefinition;
import org.pentaho.actionsequence.dom.actions.ActionFactory;
import org.pentaho.actionsequence.dom.actions.JFreeReportAction;
import org.pentaho.commons.connection.ActivationHelper;
import org.pentaho.commons.connection.IPentahoMetaData;
import org.pentaho.commons.connection.IPentahoResultSet;
import org.pentaho.platform.api.data.IDataComponent;
import org.pentaho.platform.api.data.IPreparedComponent;
import org.pentaho.platform.api.engine.IActionParameter;
import org.pentaho.platform.api.engine.IActionSequenceResource;
import org.pentaho.platform.api.engine.IApplicationContext;
import org.pentaho.platform.api.engine.IComponent;
import org.pentaho.platform.api.engine.IRuntimeContext;
import org.pentaho.platform.api.repository.IContentItem;
import org.pentaho.platform.api.repository.IContentLocation;
import org.pentaho.platform.api.repository.IContentRepository;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.plugin.action.jfreereport.components.JFreeReportValidateParametersComponent;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoDataFactory;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoResourceBundleFactory;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoResourceLoader;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoTableDataFactory;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoTableModel;
import org.pentaho.platform.plugin.action.jfreereport.helper.PentahoURLRewriter;
import org.pentaho.platform.plugin.action.jfreereport.helper.ReportUtils;
import org.pentaho.platform.plugin.action.jfreereport.repository.ReportContentRepository;
import org.pentaho.platform.plugin.action.messages.Messages;
import org.pentaho.platform.util.xml.XmlHelper;
import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
import org.pentaho.reporting.engine.classic.core.DataFactory;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.engine.classic.core.ParameterDataRow;
import org.pentaho.reporting.engine.classic.core.ReportProcessingException;
import org.pentaho.reporting.engine.classic.core.ResourceBundleFactory;
import org.pentaho.reporting.engine.classic.core.layout.output.YieldReportListener;
import org.pentaho.reporting.engine.classic.core.modules.gui.base.PreviewDialog;
import org.pentaho.reporting.engine.classic.core.modules.gui.base.ReportController;
import org.pentaho.reporting.engine.classic.core.modules.gui.print.PrintUtil;
import org.pentaho.reporting.engine.classic.core.modules.output.pageable.base.PageableReportProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.PdfOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.FlowReportProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.base.StreamReportProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.csv.StreamCSVOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.AllItemsHtmlPrinter;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlPrinter;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.StreamHtmlOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.html.URLRewriter;
import org.pentaho.reporting.engine.classic.core.modules.output.table.rtf.StreamRTFOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.FlowExcelOutputProcessor;
import org.pentaho.reporting.engine.classic.core.modules.output.xml.XMLProcessor;
import org.pentaho.reporting.engine.classic.core.modules.parser.base.ReportGenerator;
import org.pentaho.reporting.engine.classic.core.util.ReportProperties;
import org.pentaho.reporting.engine.classic.extensions.modules.java14print.Java14PrintUtil;
import org.pentaho.reporting.libraries.base.config.Configuration;
import org.pentaho.reporting.libraries.base.config.ModifiableConfiguration;
import org.pentaho.reporting.libraries.base.util.IOUtils;
import org.pentaho.reporting.libraries.repository.ContentIOException;
import org.pentaho.reporting.libraries.repository.ContentLocation;
import org.pentaho.reporting.libraries.repository.DefaultNameGenerator;
import org.pentaho.reporting.libraries.repository.NameGenerator;
import org.pentaho.reporting.libraries.repository.file.FileRepository;
import org.pentaho.reporting.libraries.repository.stream.StreamRepository;
import org.pentaho.reporting.libraries.resourceloader.FactoryParameterKey;
import org.pentaho.reporting.libraries.resourceloader.ResourceException;
import org.pentaho.reporting.libraries.resourceloader.ResourceKey;
import org.pentaho.reporting.libraries.resourceloader.ResourceManager;
import org.xml.sax.InputSource;
/**
* The JFreeReportComponent provides a simple-to-use frontend for the reporting
* process. <p/> This component will execute JFreeReport reports in one of two
* different modes: <p/>
* <h3>sqlMode = true</h3>
* <p/> This means that the JFreeReport component is expected to execute an SQL query,
* wrap the resulting SQL Resultset in a TableModel, and use that to execute a report
* whose definition is in the file system. In this mode, the action-sequence
* definition must contain the following elements: In the resource-definition section,
* there must be a resource called "report-definition" which defines the location of
* the jfreereport xml document. <p/> In the component-definition sction, there must
* be the following entries:
* <ul>
* <li>A "query" parameter which contains an SQL query.</li>
* <li>Either for connecting to the SQL datasource:
* <ul>
* <li>A "jndi" parameter (with the jndi name of the datasource)</li>
* <li>or The database parameters "driver", "user-id", "password" and "connection" so
* that a database connection can be established for running the afore-mentioned
* "query".</li>
* </ul>
* </li>
* </ul>
* <h3>sqlMode = false</h3>
* <p/> This means that the JFreeReport component is expected to execute a report that
* exists in a .jar file (like the reporting demo reports) along with the TableModel
* class that provides the data for the report. In this mode, the action-sequence
* definition must contain the following elements: In the resource-definition section,
* there must be a resource called "report-jar" that points to the .jar file that
* contains the report .xml file, and the TableModel implementation. <p/> In the
* component-definition section, there must be two entries:
* <ul>
* <li> "report-location" - This is the location of the report .xml document (e.g.
* org/jfree/report/demo/report1.xml)</li>
* <li> "class-location" - This is the package-qualified class that implements
* TableModel (e.g. org.jfree.report.demo.SampleData1).</li>
* </ul>
*
* @author mbatchel
* @created Sep 8, 2005
*/
@SuppressWarnings("deprecation")
public class JFreeReportComponent extends AbstractJFreeReportComponent {
protected static final Log logger = LogFactory.getLog(JFreeReportComponent.class);
private static final long serialVersionUID = -4185151399689983507L;
private static final int INIT_REPORT_PARAMS_STATUS_PASSED = 1;
private static final int INIT_REPORT_PARAMS_STATUS_FAILED = 2;
private static final int INIT_REPORT_PARAMS_STATUS_PROMPT_PENDING = 3;
private static final String PROGRESS_DIALOG_ENABLED_KEY = "org.jfree.report.modules.gui.base.ProgressDialogEnabled";//$NON-NLS-1$
private static final String PROGRESS_BAR_ENABLED_KEY = "org.jfree.report.modules.gui.base.ProgressBarEnabled";//$NON-NLS-1$
private static final boolean DO_NOT_USE_THE_CONTENT_REPOSITORY = true;
private JFreeReportValidateParametersComponent validateParametersComponent;
public JFreeReportComponent() {
}
@Override
public boolean init() {
return true;
}
@Override
public void done() {
}
@Override
public boolean validateSystemSettings() {
return true;
}
@Override
public Log getLogger() {
return LogFactory.getLog(JFreeReportComponent.class);
}
protected boolean initAndValidate(final IComponent component) {
component.setInstanceId(getInstanceId());
component.setActionName(getActionName());
component.setProcessId(getProcessId());
component.setComponentDefinition(getComponentDefinition());
component.setRuntimeContext(getRuntimeContext());
component.setSession(getSession());
component.setLoggingLevel(getLoggingLevel());
component.setMessages(getMessages());
return (component.validate() == IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_OK);
}
/**
* We cannot validate the parameters of all components, as the required parameters
* might not have been created.
*
* @return
*/
@Override
public boolean validateAction() {
boolean result = true;
if (!(getActionDefinition() instanceof JFreeReportAction)) {
error(Messages.getInstance().getErrorString(
"ComponentBase.ERROR_0001_UNKNOWN_ACTION_TYPE", getActionDefinition().getElement().asXML())); //$NON-NLS-1$
result = false;
} else {
validateParametersComponent = new JFreeReportValidateParametersComponent();
if (initAndValidate(validateParametersComponent) == false) {
error(Messages.getInstance().getString("JFreeReportComponent.ERROR_0025_COULD_NOT_VALIDATE")); //$NON-NLS-1$
result = false;
}
}
return result;
}
private boolean isParameterUIAvailable() {
/*
* See if we are allowed to generate a parameter selection user interface. If
* we are being called as part of a process, this will not be allowed.
*/
if (!feedbackAllowed()) {
// We could not get an output stream for the feedback, but we are
// allowed
// to generate UI, so return an error
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0020_INVALID_FEEDBACK_STREAM")); //$NON-NLS-1$
return false;
}
// We need input from the user, we have delivered an input form into the
// feeback stream
setFeedbackMimeType("text/html"); //$NON-NLS-1$
return true;
}
private int initReportParams() {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
int result = JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PASSED;
final String defaultValue = ""; //$NON-NLS-1$
IActionInput[] actionInputs = jFreeReportAction.getInputs();
for (IActionInput element : actionInputs) {
Object paramValue = element.getValue();
String inputName = element.getName();
if ((paramValue == null) || ("".equals(paramValue))) //$NON-NLS-1$
{
IActionParameter paramParameter = getInputParameter(inputName);
if (paramParameter.getPromptStatus() == IActionParameter.PROMPT_PENDING) {
result = JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PROMPT_PENDING;
continue;
}
if (isParameterUIAvailable()) {
// The parameter value was not provided, and we are allowed
// to
// create user interface forms
createFeedbackParameter(inputName, inputName, "", defaultValue, true); //$NON-NLS-1$
result = JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PROMPT_PENDING;
} else {
result = JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_FAILED;
}
}
}
return result;
}
/**
* This method gets called from the outside. Based upon our mode call the correct
* function.
*/
@Override
public boolean executeAction() {
int initParamsResult = initReportParams();
boolean result = false;
if (initParamsResult == JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_FAILED) {
result = false;
} else if ((initParamsResult == JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PROMPT_PENDING) || isPromptPending()) {
result = true;
} else if (initParamsResult == JFreeReportComponent.INIT_REPORT_PARAMS_STATUS_PASSED) {
result = executeReportAction();
}
return result;
}
protected boolean executeReportAction() {
boolean result = false;
try {
MasterReport report = getReport();
if (report != null) {
addTempParameterObject(AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_OBJINPUT, report);
if (initReportConfigParameters(report) && (initReportInputs(report))) {
result = generateReport(report, getDataFactory());
}
}
} catch (ClassNotFoundException ex) {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0021_DATA_COMPONENT_FAILED"), ex); //$NON-NLS-1$
} catch (InstantiationException ex) {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0021_DATA_COMPONENT_FAILED"), ex); //$NON-NLS-1$
} catch (IllegalAccessException ex) {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0021_DATA_COMPONENT_FAILED"), ex); //$NON-NLS-1$
} catch (IOException ex) {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0008_INVALID_OUTPUT_STREAM"), ex); //$NON-NLS-1$
} catch (Exception ex) {
error(ex.getMessage());
}
return result;
}
protected PentahoTableDataFactory getDataFactory() throws ClassNotFoundException, InstantiationException,
IllegalAccessException, Exception {
PentahoTableDataFactory factory = null;
factory = getQueryComponentDataFactory();
if (factory == null) {
factory = getInputParamDataFactory();
}
if (factory == null) {
factory = getJarDataFactory();
}
if (factory == null) {
throw new Exception(Messages.getInstance().getString("JFreeReport.ERROR_0022_DATA_INPUT_INVALID_OBJECT")); //$NON-NLS-1$
}
return factory;
}
private PentahoTableDataFactory getQueryComponentDataFactory() throws ClassNotFoundException, InstantiationException,
IllegalAccessException, Exception {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
PentahoTableDataFactory factory = null;
String dataComponentName = jFreeReportAction.getDataComponent().getStringValue();
String origComponentName = jFreeReportAction.getComponentName();
if (dataComponentName != null) {
if (JFreeReportAction.SQL_DATA_SOURCE.equalsIgnoreCase(dataComponentName)) {
dataComponentName = AbstractJFreeReportComponent.DATACOMPONENT_SQLCLASS;
} else if (JFreeReportAction.MDX_DATA_SOURCE.equalsIgnoreCase(dataComponentName)) {
dataComponentName = AbstractJFreeReportComponent.DATACOMPONENT_MDXCLASS;
}
try {
// This is a giant hack and a big no, no. Basically we're going to transform the JFreeReportAction into a
// SQL or MDX lookup action, by changing its component name. Then we create the appropriate component to run the transformed action.
// All this to support the DB and Query info being embedded in the JFreeReport action. This is definitely deprecated functionality
// that should not be relied upon. The correct way to do this is to create an SQL or MDX action prior to the JFreeReport
// action in the action sequence. That action performs the desired query, then pass the results of that query to the JFreeReport
// action.
jFreeReportAction.setComponentName(dataComponentName);
ActionDefinition tmpActionDefinition = ActionFactory.getActionDefinition(jFreeReportAction.getElement(),
jFreeReportAction.getActionParameterMgr());
final Class componentClass = Class.forName(dataComponentName);
IDataComponent dataComponent = (IDataComponent) componentClass.newInstance();
dataComponent.setInstanceId(getInstanceId());
dataComponent.setActionName(getActionName());
dataComponent.setProcessId(getProcessId());
dataComponent.setActionDefinition(tmpActionDefinition);
dataComponent.setComponentDefinition(getComponentDefinition());
dataComponent.setRuntimeContext(getRuntimeContext());
dataComponent.setSession(getSession());
dataComponent.setLoggingLevel(getLoggingLevel());
dataComponent.setMessages(getMessages());
// if that fails, then we know we messed up again.
// Abort, we cant continue anyway.
if ((dataComponent.validate() == IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_OK) && dataComponent.init()
&& (dataComponent.execute() == IRuntimeContext.RUNTIME_STATUS_SUCCESS)) {
final IPentahoResultSet resultset = dataComponent.getResultSet();
factory = new PentahoTableDataFactory(AbstractJFreeReportComponent.DATACOMPONENT_DEFAULTINPUT,
new PentahoTableModel(resultset));
} else {
throw new IllegalArgumentException(Messages.getInstance().getErrorString("JFreeReport.ERROR_0021_DATA_COMPONENT_FAILED")); //$NON-NLS-1$
}
} catch (ClassNotFoundException e) {
JFreeReportComponent.logger.error(null, e);
} catch (InstantiationException e) {
JFreeReportComponent.logger.error(null, e);
} catch (IllegalAccessException e) {
JFreeReportComponent.logger.error(null, e);
} finally {
jFreeReportAction.setComponentName(origComponentName);
}
}
return factory;
}
private PentahoTableDataFactory getJarDataFactory() throws Exception {
PentahoTableDataFactory factory = null;
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
try {
org.pentaho.actionsequence.dom.IActionResource actionResource = jFreeReportAction.getDataJar().getJar();
if (actionResource != null) {
DataSource dataSource = new ActivationHelper.PentahoStreamSourceWrapper(actionResource.getDataSource());
InputStream in = dataSource.getInputStream();
try {
// not being able to read a single char is definitly a big boo ..
if (in.read() == -1) {
throw new Exception(Messages.getInstance().getErrorString("JFreeReport.ERROR_0009_REPORT_JAR_UNREADABLE")); //$NON-NLS-1$
} else {
final ClassLoader loader = ReportUtils.createJarLoader(getSession(), getResource(actionResource.getName()));
if (loader == null) {
throw new Exception(Messages.getInstance()
.getString("JFreeReportDataComponent.ERROR_0035_COULD_NOT_CREATE_CLASSLOADER")); //$NON-NLS-1$
} else if (!isDefinedInput(AbstractJFreeReportComponent.DATACOMPONENT_CLASSLOCINPUT)) {
throw new Exception(Messages.getInstance().getErrorString("JFreeReport.ERROR_0012_CLASS_LOCATION_MISSING")); //$NON-NLS-1$
} else {
// Get input parameters, and set them as properties in the report
// object.
final ReportProperties reportProperties = new ReportProperties();
IActionInput[] actionInputs = jFreeReportAction.getInputs();
for (IActionInput element : actionInputs) {
final Object paramValue = element.getValue();
if (paramValue instanceof Object[]) {
final Object[] values = (Object[]) paramValue;
final StringBuffer valuesBuffer = new StringBuffer();
// TODO support non-string items
for (int z = 0; z < values.length; z++) {
if (z == 0) {
valuesBuffer.append(values[z].toString());
} else {
valuesBuffer.append(',').append(values[z].toString());
}
}
reportProperties.put(element.getName(), valuesBuffer.toString());
} else {
reportProperties.put(element.getName(), paramValue);
}
}
final DataFactory dataFactory = new PentahoDataFactory(loader);
final TableModel model = dataFactory.queryData(jFreeReportAction.getDataJar().getDataClass(),
new ParameterDataRow(reportProperties));
factory = new PentahoTableDataFactory(AbstractJFreeReportComponent.DATACOMPONENT_DEFAULTINPUT, model);
}
}
} catch (Exception e) {
throw new Exception(Messages.getInstance().getErrorString("JFreeReport.ERROR_0009_REPORT_JAR_UNREADABLE")); //$NON-NLS-1$
}
}
} catch (FileNotFoundException e1) {
throw new Exception(Messages.getInstance().getErrorString("JFreeReport.ERROR_0010_REPORT_JAR_MISSING", jFreeReportAction //$NON-NLS-1$
.getDataJar().toString()));
}
return factory;
}
private PentahoTableDataFactory getInputParamDataFactory() {
PentahoTableDataFactory factory = null;
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
ActionInput reportDataParam = (ActionInput) jFreeReportAction.getData();
Object dataObject = reportDataParam != null ? reportDataParam.getValue() : null;
if ((dataObject instanceof IPentahoResultSet) || (dataObject instanceof TableModel)) {
factory = new PentahoTableDataFactory();
if (dataObject instanceof IPentahoResultSet) {
final IPentahoResultSet resultset = (IPentahoResultSet) dataObject;
resultset.beforeFirst();
factory.addTable(AbstractJFreeReportComponent.DATACOMPONENT_DEFAULTINPUT, new PentahoTableModel(resultset));
} else if (dataObject instanceof TableModel) {
factory.addTable(AbstractJFreeReportComponent.DATACOMPONENT_DEFAULTINPUT, (TableModel) dataObject);
}
IActionInput[] subreportQueries = jFreeReportAction.getSubreportQueryParams();
for (IActionInput element : subreportQueries) {
dataObject = element.getValue();
if (dataObject instanceof IPreparedComponent) {
factory.addPreparedComponent(element.getName(), (IPreparedComponent) dataObject);
} else if (dataObject instanceof IPentahoResultSet) {
final IPentahoResultSet resultset = (IPentahoResultSet) dataObject;
resultset.beforeFirst();
factory.addTable(element.getName(), new PentahoTableModel(resultset));
} else if (dataObject instanceof TableModel) {
factory.addTable(element.getName(), (TableModel) dataObject);
}
}
}
return factory;
}
private String getHostColonPort(final String pentahoBaseURL) {
try {
URL url = new URL(pentahoBaseURL);
return url.getHost() + ":" + url.getPort();//$NON-NLS-1$
} catch (Exception e) {
}
return pentahoBaseURL;
}
private String getBaseServerURL(final String pentahoBaseURL) {
try {
URL url = new URL(pentahoBaseURL);
return url.getProtocol() + "://" + url.getHost() + ":" + url.getPort(); //$NON-NLS-1$ //$NON-NLS-2$
} catch (Exception e) {
}
return pentahoBaseURL;
}
private MasterReport parseReport(final IActionSequenceResource resource) {
try {
// define the resource url so that PentahoResourceLoader recognizes the path.
String resourceUrl = PentahoResourceLoader.SOLUTION_SCHEMA_NAME + PentahoResourceLoader.SCHEMA_SEPARATOR
+ resource.getAddress();
String pentahoBaseURL = PentahoSystem.getApplicationContext().getBaseUrl();
HashMap<FactoryParameterKey, Object> helperObjects = new HashMap<FactoryParameterKey, Object>();
helperObjects.put(new FactoryParameterKey("pentahoBaseURL"), PentahoSystem.getApplicationContext().getBaseUrl()); //$NON-NLS-1$
// trim out the server and port
helperObjects.put(new FactoryParameterKey("serverBaseURL"), getBaseServerURL(pentahoBaseURL)); //$NON-NLS-1$
helperObjects.put(
new FactoryParameterKey("solutionRoot"), PentahoSystem.getApplicationContext().getSolutionPath("")); //$NON-NLS-1$ //$NON-NLS-2$
// get the host:port portion only
helperObjects.put(new FactoryParameterKey("hostColonPort"), getHostColonPort(pentahoBaseURL)); //$NON-NLS-1$
Iterator it = getInputNames().iterator();
while (it.hasNext()) {
try {
String inputName = (String) it.next();
// do not store the data as it would always force a cache refresh and it has no bearing
// on how the report definition would be parsed
if (AbstractJFreeReportComponent.DATACOMPONENT_DATAINPUT.equals(inputName)) {
continue;
}
String inputValue = getInputStringValue(inputName);
helperObjects.put(new FactoryParameterKey(inputName), inputValue);
} catch (Exception e) {
}
}
ResourceManager resourceManager = new ResourceManager();
resourceManager.registerDefaults();
ResourceKey contextKey = resourceManager.createKey(resourceUrl, helperObjects);
ResourceKey key = resourceManager.createKey(resourceUrl, helperObjects);
return ReportGenerator.getInstance().parseReport(resourceManager, key, contextKey);
} catch (Exception ex) {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0007_COULD_NOT_PARSE", resource.getAddress()), ex); //$NON-NLS-1$
return null;
}
}
public MasterReport getReport() throws Exception {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
MasterReport report = getReportFromResource();
if (report == null) {
report = getReportFromInputParam();
if (report == null) {
report = getReportFromJar();
}
}
if ((report != null) && jFreeReportAction.getCreatePrivateCopy().getBooleanValue(false)) {
report = (MasterReport) report.clone();
}
return report;
}
private MasterReport getReportFromResource() throws ResourceException, IOException {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
MasterReport report = null;
Object reportDefinition = jFreeReportAction.getReportDefinition();
IActionSequenceResource resource = null;
if (reportDefinition instanceof ActionResource) {
resource = getResource(((ActionResource) reportDefinition).getName());
}
if (resource != null) {
if (resource.getSourceType() == IActionResource.XML) {
String repDef = resource.getAddress();
ReportGenerator generator = ReportGenerator.createInstance();
// add the runtime context so that PentahoResourceData class can get access to the solution repo
// generator.setObject(PentahoResourceData.PENTAHO_RUNTIME_CONTEXT_KEY, getRuntimeContext());
// Read the encoding from the XML file - see BISERVER-895
final String encoding = XmlHelper.getEncoding(repDef, null);
ByteArrayInputStream inStream = new ByteArrayInputStream(repDef.getBytes(encoding));
InputSource repDefInputSource = new InputSource(inStream);
repDefInputSource.setEncoding(encoding);
report = generator.parseReport(repDefInputSource, getDefinedResourceURL(null));
} else {
report = parseReport(resource);
}
}
return report;
}
private MasterReport getReportFromInputParam() throws ResourceException, UnsupportedEncodingException, IOException {
MasterReport report = null;
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
Object reportDefinition = jFreeReportAction.getReportDefinition();
if (reportDefinition instanceof ActionInput) {
String repDef = ((ActionInput) reportDefinition).getStringValue();
report = createReport(repDef);
}
return report;
}
protected MasterReport createReport(final String reportDefinition) throws ResourceException, IOException {
ReportGenerator generator = ReportGenerator.createInstance();
// add the runtime context so that PentahoResourceData class can get access to the solution repo
// generator.setObject(PentahoResourceData.PENTAHO_RUNTIME_CONTEXT_KEY, getRuntimeContext());
// get base URL
String baseURL = PentahoSystem.getApplicationContext().getBaseUrl();
URL url = null;
try {
url = new URL(baseURL);
} catch (Exception e) {
// a null URL is ok
warn(Messages.getInstance().getString("JFreeReportLoadComponent.WARN_COULD_NOT_CREATE_URL")); //$NON-NLS-1$
}
// Read the encoding from the XML file - see BISERVER-895
final String encoding = XmlHelper.getEncoding(reportDefinition, null);
ByteArrayInputStream inStream = new ByteArrayInputStream(reportDefinition.getBytes(encoding));
InputSource reportDefinitionInputSource = new InputSource(inStream);
reportDefinitionInputSource.setEncoding(encoding);
return generator.parseReport(reportDefinitionInputSource, getDefinedResourceURL(url));
}
private MasterReport getReportFromJar() throws Exception {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
MasterReport report;
org.pentaho.actionsequence.dom.IActionResource reportJar = jFreeReportAction.getReportDefinitionJar().getJar();
final IActionSequenceResource resource = getResource(reportJar.getName());
final ClassLoader loader = ReportUtils.createJarLoader(getSession(), resource);
if (loader == null) {
throw new Exception(Messages.getInstance().getString("JFreeReportLoadComponent.ERROR_0035_COULD_NOT_CREATE_CLASSLOADER")); //$NON-NLS-1$
}
String reportLocation = jFreeReportAction.getReportDefinitionJar().getReportLocation();
URL resourceUrl = loader.getResource(reportLocation);
if (resourceUrl == null) {
throw new Exception(Messages.getInstance().getErrorString("JFreeReport.ERROR_0016_REPORT_RESOURCE_INVALID", //$NON-NLS-1$
reportLocation, resource.getAddress()));
}
try {
ReportGenerator generator = ReportGenerator.getInstance();
// add the runtime context so that PentahoResourceData class can get access to the solution repo
// generator.setObject(PentahoResourceData.PENTAHO_RUNTIME_CONTEXT_KEY, getRuntimeContext());
report = generator.parseReport(resourceUrl, getDefinedResourceURL(resourceUrl));
} catch (Exception ex) {
throw new Exception(Messages.getInstance().getErrorString("JFreeReport.ERROR_0007_COULD_NOT_PARSE", reportLocation), ex); //$NON-NLS-1$
}
return report;
}
private URL getDefinedResourceURL(final URL defaultValue) {
if (isDefinedInput(AbstractJFreeReportComponent.REPORTLOAD_RESURL) == false) {
return defaultValue;
}
try {
final String inputStringValue = getInputStringValue(Messages.getInstance()
.getString(AbstractJFreeReportComponent.REPORTLOAD_RESURL));
return new URL(inputStringValue);
} catch (Exception e) {
return defaultValue;
}
}
private boolean initReportConfigParameters(final MasterReport report) {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
boolean result = true;
if (isDefinedInput(AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_OBJINPUT)) {
Object reportConfigParams = jFreeReportAction.getReportConfig().getValue();
if (reportConfigParams != null) {
if (reportConfigParams instanceof IPentahoResultSet) {
setReportConfigParameters(report, (IPentahoResultSet) reportConfigParams);
} else if (reportConfigParams instanceof Map) {
setReportConfigParameters(report, (Map) reportConfigParams);
} else if (reportConfigParams instanceof JFreeReportAction.StaticReportConfig) {
setReportConfigParameters(report, (JFreeReportAction.StaticReportConfig) reportConfigParams);
} else {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0026_UNKNOWN_REPORT_CONFIGURATION_PARAMETERS")); //$NON-NLS-1$
result = false;
;
}
}
}
return result;
}
private void setReportConfigParameters(final MasterReport report,
final JFreeReportAction.StaticReportConfig reportConfig) {
// We have some configuration parameters in the component definition
for (int i = 0; i < reportConfig.size(); i++) {
JFreeReportAction.StaticReportConfigItem staticReportConfigItem = (JFreeReportAction.StaticReportConfigItem) reportConfig
.get(i);
String parmName = staticReportConfigItem.getName();
String parmValue = staticReportConfigItem.getValue();
if ((parmName == null) || (parmName.length() == 0)) {
// Ignore configuration settings without name=
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0027_REPORT_CONFIGURATION_PARAMETER_IGNORED")); //$NON-NLS-1$
continue;
}
if (parmValue != null) {
parmValue = parmValue.trim();
if (parmValue.length() > 0) {
report.getReportConfiguration().setConfigProperty(parmName, applyInputsToFormat(parmValue));
} else {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0027_REPORT_CONFIGURATION_PARAMETER_IGNORED")); //$NON-NLS-1$
}
} else {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0027_REPORT_CONFIGURATION_PARAMETER_IGNORED")); //$NON-NLS-1$
}
}
}
private void setReportConfigParameters(final MasterReport report, final Map values) {
Map.Entry ent;
ModifiableConfiguration config = report.getReportConfiguration();
Iterator it = values.entrySet().iterator();
while (it.hasNext()) {
ent = (Map.Entry) it.next();
if ((ent.getKey() != null) && (ent.getValue() != null)) {
config.setConfigProperty(ent.getKey().toString(), applyInputsToFormat(ent.getValue().toString()));
}
}
}
private void setReportConfigParameters(final MasterReport report, final IPentahoResultSet values) {
int rowCount = values.getRowCount();
int colCount = values.getColumnCount();
ModifiableConfiguration config = report.getReportConfiguration();
if (colCount >= 2) {
IPentahoMetaData md = values.getMetaData();
int nameIdx = md.getColumnIndex("name");//$NON-NLS-1$
int valIdx = md.getColumnIndex("value");//$NON-NLS-1$
if (nameIdx < 0) {
nameIdx = 0;
}
if (valIdx < 0) {
valIdx = 1;
}
for (int i = 0; i < rowCount; i++) {
Object[] aRow = values.getDataRow(i);
if ((aRow[nameIdx] != null) && (aRow[valIdx] != null)) {
config.setConfigProperty(aRow[nameIdx].toString(), applyInputsToFormat(aRow[valIdx].toString()));
}
}
} else {
error(Messages.getInstance().getErrorString("JFreeReport.ERROR_0025_INVALID_REPORT_CONFIGURATION_PARAMETERS")); //$NON-NLS-1$
}
}
private boolean initReportInputs(final MasterReport report) throws CloneNotSupportedException {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
// Get input parameters, and set them as properties in the report
// object.
IActionInput[] actionInputs = jFreeReportAction.getInputs();
for (IActionInput element : actionInputs) {
String paramName = element.getName();
Object paramValue = element.getValue();
if ((paramValue == null) || "".equals(paramValue)) { //$NON-NLS-1$
continue;
}
// we filter some well-known bad-guys. It is dangerous to have the
// report-object (the parsed JFreeReport object), the "report-data"
// (the tablemodel) or the "data" reference copied to the report.
// also dangerous are result sets and table models.
if (paramValue instanceof IPentahoResultSet) {
continue;
}
if (paramValue instanceof TableModel) {
continue;
}
if (AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_OBJINPUT.equals(paramName)) {
continue;
}
if (AbstractJFreeReportComponent.DATACOMPONENT_REPORTTEMP_DATAINPUT.equals(paramName)) {
continue;
}
if (AbstractJFreeReportComponent.DATACOMPONENT_DATAINPUT.equals(paramName)) {
continue;
}
if (paramValue instanceof Object[]) {
Object values[] = (Object[]) paramValue;
StringBuffer valuesBuffer = new StringBuffer();
// TODO support non-string items
for (int j = 0; j < values.length; j++) {
if (j == 0) {
valuesBuffer.append(values[j].toString());
} else {
valuesBuffer.append(',').append(values[j].toString());
}
}
report.setProperty(paramName, valuesBuffer.toString());
} else {
report.setProperty(paramName, paramValue);
}
}
return true;
}
private String getMimeType(final String outputFormat) {
String mimeType = null;
if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_HTML.equals(outputFormat)) {
mimeType = "text/html"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_PDF.equals(outputFormat)) {
mimeType = "application/pdf"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XLS.equals(outputFormat)) {
mimeType = "application/vnd.ms-excel"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_CSV.equals(outputFormat)) {
mimeType = "text/csv"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_RTF.equals(outputFormat)) {
mimeType = "application/rtf"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XML.equals(outputFormat)) {
mimeType = "text/xml"; //$NON-NLS-1$
}
return mimeType;
}
private String getFileExtension(final String outputFormat) {
String fileExtension = null;
if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_HTML.equals(outputFormat)) {
fileExtension = ".html"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_PDF.equals(outputFormat)) {
fileExtension = ".pdf"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XLS.equals(outputFormat)) {
fileExtension = ".xls"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_CSV.equals(outputFormat)) {
fileExtension = ".csv"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_RTF.equals(outputFormat)) {
fileExtension = ".rtf"; //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XML.equals(outputFormat)) {
fileExtension = ".xml"; //$NON-NLS-1$
}
return fileExtension;
}
private boolean generateReport(final MasterReport report, final PentahoTableDataFactory factory) throws IOException {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
boolean result = false;
applyThreadPriority();
// this might be invalid in case the action is contained in a sub-directory.
final String baseName = IOUtils.getInstance().stripFileExtension(getActionName());
final String path = getSolutionName() + File.separator + getSolutionPath();
final PentahoResourceBundleFactory bundleFactory = new PentahoResourceBundleFactory(path, baseName, getSession());
report.setResourceBundleFactory(bundleFactory);
// set the default resourcebundle. This allows users to override the
// resource-bundle in case they want to keep common strings in a common
// collection.
report.getReportConfiguration().setConfigProperty(ResourceBundleFactory.DEFAULT_RESOURCE_BUNDLE_CONFIG_KEY,
baseName);
if (factory != null) {
report.setDataFactory(factory);
}
String printerName = jFreeReportAction.getPrinterName().getStringValue();
String outputFormat = jFreeReportAction.getOutputType().getStringValue();
if (printerName != null) {
result = print(report, getActionTitle(), printerName);
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_SWING.equals(outputFormat)) {
if (GraphicsEnvironment.isHeadless()) {
result = writeSwingPreview(report);
}
warn(Messages.getInstance().getString("JFreeReportAllContentComponent.WARN_HEADLESSMODE_ACTIVE")); //$NON-NLS-1$
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_HTML.equals(outputFormat)
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_PDF.equals(outputFormat)
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XLS.equals(outputFormat)
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_CSV.equals(outputFormat)
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_RTF.equals(outputFormat)
|| AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XML.equals(outputFormat)) {
String mimeType = getMimeType(outputFormat);
String fileExtention = getFileExtension(outputFormat);
IContentItem contentItem = getContentItem(mimeType, fileExtention);
OutputStream outputStream = null;
if (contentItem != null) {
outputStream = contentItem.getOutputStream(getActionName());
} else {
outputStream = getDefaultOutputStream(mimeType);
}
result = writeReport(outputFormat, report, outputStream, jFreeReportAction.getReportGenerationYieldRate()
.getIntValue(0), jFreeReportAction.getHtmlContentHandlerUrlPattern().getStringValue());
if (contentItem != null) {
contentItem.closeOutputStream();
}
// force close the factory
factory.finalize();
} else {
warn(Messages.getInstance().getString("JFreeReportAllContentComponent.WARN_NO_PRINTER_GIVEN")); //$NON-NLS-1$
}
return result;
}
private void applyThreadPriority() {
String priority = ((JFreeReportAction) getActionDefinition()).getReportGenerationPriority().getStringValue();
try {
if (AbstractJFreeReportComponent.REPORTGENERATE_PRIORITYLOWER.equals(priority)) {
Thread.currentThread().setPriority(Math.max(Thread.currentThread().getPriority() - 1, 1));
} else if (AbstractJFreeReportComponent.REPORTGENERATE_PRIORITYLOWEST.equals(priority)) {
Thread.currentThread().setPriority(1);
}
} catch (Exception e) {
// Non fatal exception.
warn(Messages.getInstance().getString("AbstractGenerateContentComponent.JFreeReport.ERROR_0044_UNABLE_T0_SET_THREAD_PRIORITY")); //$NON-NLS-1$
}
}
protected IContentItem getContentItem(final String mimeType, final String extension) {
JFreeReportAction jFreeReportAction = (JFreeReportAction) getActionDefinition();
// Try to get the output from the action-sequence document.
IContentItem contentItem = null;
IActionOutput actionOutput = jFreeReportAction.getOutputReport();
if (actionOutput != null) {
contentItem = getOutputItem(actionOutput.getName(), mimeType, extension);
contentItem.setMimeType(mimeType);
} else if (getOutputNames().size() == 1) {
String outputName = (String) getOutputNames().iterator().next();
contentItem = getOutputContentItem(outputName, mimeType);
contentItem.setMimeType(mimeType);
}
return contentItem;
}
private boolean writeReport(final String outputFormat, final MasterReport report, final OutputStream outputStream,
final int yieldRate, final String htmlContentHandlerUrlPattern) {
boolean result = false;
if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_HTML.equals(outputFormat)) {
result = writeHtml(report, outputStream, yieldRate, htmlContentHandlerUrlPattern);
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_PDF.equals(outputFormat)) {
result = writePdf(report, outputStream, yieldRate);
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XLS.equals(outputFormat)) {
result = writeXls(report, outputStream, yieldRate);
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_CSV.equals(outputFormat)) {
result = writeCsv(report, outputStream, yieldRate);
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_RTF.equals(outputFormat)) {
result = writeRtf(report, outputStream, yieldRate);
} else if (AbstractJFreeReportComponent.REPORTALLCONTENT_OUTPUTTYPE_XML.equals(outputFormat)) {
result = writeXml(report, outputStream);
}
return result;
}
public boolean writeHtml(final MasterReport report, final OutputStream outputStream, final int yieldRate,
String htmlContentHandlerUrlPattern) {
try {
IContentRepository contentRepository = null;
if( PentahoSystem.getObjectFactory().objectDefined( IContentRepository.class.getSimpleName() ) ) {
contentRepository = PentahoSystem.get( IContentRepository.class, getSession() );
} else {
debug(Messages.getInstance().getString("JFreeReportHtmlComponent.DEBUG_0044_PROCESSING_WITHOUT_CONTENT_REPOS") ); //$NON-NLS-1$
}
if (htmlContentHandlerUrlPattern == null) {
final Configuration globalConfig = ClassicEngineBoot.getInstance().getGlobalConfig();
htmlContentHandlerUrlPattern = globalConfig.getConfigProperty("org.pentaho.web.ContentHandler"); //$NON-NLS-1$
}
final IApplicationContext ctx = PentahoSystem.getApplicationContext();
final URLRewriter rewriter;
final ContentLocation dataLocation;
final NameGenerator dataNameGenerator;
if ((contentRepository == null) || JFreeReportComponent.DO_NOT_USE_THE_CONTENT_REPOSITORY) {
debug(Messages.getInstance().getString("JFreeReportHtmlComponent.DEBUG_0044_PROCESSING_WITHOUT_CONTENT_REPOS")); //$NON-NLS-1$
if (ctx != null) {
File dataDirectory = new File(ctx.getFileOutputPath("system/tmp/"));//$NON-NLS-1$
if (dataDirectory.exists() && (dataDirectory.isDirectory() == false)) {
dataDirectory = dataDirectory.getParentFile();
if (dataDirectory.isDirectory() == false) {
throw new ReportProcessingException(Messages.getInstance().getErrorString(
"JFreeReportDirectoryComponent.ERROR_0001_INVALID_DIR", dataDirectory.getPath())); //$NON-NLS-1$
}
} else if (dataDirectory.exists() == false) {
dataDirectory.mkdirs();
}
final FileRepository dataRepository = new FileRepository(dataDirectory);
dataLocation = dataRepository.getRoot();
dataNameGenerator = new DefaultNameGenerator(dataLocation);
rewriter = new PentahoURLRewriter(htmlContentHandlerUrlPattern);
} else {
dataLocation = null;
dataNameGenerator = null;
rewriter = new PentahoURLRewriter(htmlContentHandlerUrlPattern);
}
} else {
debug(Messages.getInstance().getString("JFreeReportHtmlComponent.DEBUG_045_PROCESSING_WITH_CONTENT_REPOS")); //$NON-NLS-1$
final String thePath = getSolutionName() + "/" + getSolutionPath() + "/" + getSession().getId();//$NON-NLS-1$//$NON-NLS-2$
final IContentLocation pentahoContentLocation = contentRepository.newContentLocation(thePath, getActionName(),
getActionTitle(), getSolutionPath(), true);
// todo
final ReportContentRepository repository = new ReportContentRepository(pentahoContentLocation, getActionName());
dataLocation = repository.getRoot();
dataNameGenerator = new DefaultNameGenerator(dataLocation);
rewriter = new PentahoURLRewriter(htmlContentHandlerUrlPattern);
}
final StreamRepository targetRepository = new StreamRepository(null, outputStream);
final ContentLocation targetRoot = targetRepository.getRoot();
final HtmlOutputProcessor outputProcessor = new StreamHtmlOutputProcessor(report.getConfiguration());
final HtmlPrinter printer = new AllItemsHtmlPrinter(report.getResourceManager());
printer.setContentWriter(targetRoot, new DefaultNameGenerator(targetRoot, "index", "html"));//$NON-NLS-1$//$NON-NLS-2$
printer.setDataWriter(dataLocation, dataNameGenerator);
printer.setUrlRewriter(rewriter);
outputProcessor.setPrinter(printer);
final StreamReportProcessor sp = new StreamReportProcessor(report, outputProcessor);
if (yieldRate > 0) {
sp.addReportProgressListener(new YieldReportListener(yieldRate));
}
sp.processReport();
sp.close();
outputStream.flush();
return true;
} catch (ReportProcessingException e) {
error(Messages.getInstance().getString("JFreeReportHtmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT"), e); //$NON-NLS-1$
return false;
} catch (IOException e) {
error(Messages.getInstance().getString("JFreeReportHtmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT"), e); //$NON-NLS-1$
return false;
} catch (ContentIOException e) {
error(Messages.getInstance().getString("JFreeReportHtmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT"), e); //$NON-NLS-1$
return false;
}
}
protected boolean writeXls(final MasterReport report, final OutputStream outputStream, final int yieldRate) {
boolean result = false;
try {
final FlowExcelOutputProcessor target = new FlowExcelOutputProcessor(report.getConfiguration(), outputStream, report.getResourceManager());
final FlowReportProcessor reportProcessor = new FlowReportProcessor(report, target);
if (isDefinedInput(AbstractJFreeReportComponent.WORKBOOK_PARAM)) {
target.setTemplateInputStream(getInputStream(AbstractJFreeReportComponent.WORKBOOK_PARAM));
}
if (yieldRate > 0) {
reportProcessor.addReportProgressListener(new YieldReportListener(yieldRate));
}
reportProcessor.processReport();
reportProcessor.close();
outputStream.flush();
result = true;
} catch (Exception e) {
error(Messages.getInstance().getString("JFreeReportExcelComponent.ERROR_0037_ERROR_READING_REPORT_INPUT"), e); //$NON-NLS-1$
}
return result;
}
protected boolean writePdf(final MasterReport report, final OutputStream outputStream, final int yieldRate) {
PageableReportProcessor proc = null;
boolean result = false;
try {
final PdfOutputProcessor outputProcessor = new PdfOutputProcessor(report.getConfiguration(), outputStream);
proc = new PageableReportProcessor(report, outputProcessor);
if (yieldRate > 0) {
proc.addReportProgressListener(new YieldReportListener(yieldRate));
}
proc.processReport();
proc.close();
proc = null;
result = true;
} catch (Exception e) {
error(Messages.getInstance().getErrorString("JFreeReportPdfComponent.ERROR_0001_WRITING_PDF_FAILED", //$NON-NLS-1$
e.getLocalizedMessage()), e);
} finally {
if (proc != null) {
proc.close();
}
}
return result;
}
public boolean print(final MasterReport report, final String jobName, final String printerName) {
boolean result = false;
if (jobName != null) {
report.getReportConfiguration().setConfigProperty(PrintUtil.PRINTER_JOB_NAME_KEY, String.valueOf(jobName));
}
PrintService printer = null;
PrintService[] services = PrintServiceLookup.lookupPrintServices(DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);
for (final PrintService service : services) {
if (service.getName().equals(printerName)) {
printer = service;
}
}
if ((printer == null) && (services.length > 0)) {
printer = services[0];
}
try {
Java14PrintUtil.printDirectly(report, printer);
result = true;
} catch (PrintException e) {
} catch (ReportProcessingException e) {
}
return result;
}
protected boolean writeCsv(final MasterReport report, final OutputStream outputStream, final int yieldRate) {
boolean result = false;
try {
final StreamCSVOutputProcessor target = new StreamCSVOutputProcessor(report.getConfiguration(), outputStream);
final StreamReportProcessor reportProcessor = new StreamReportProcessor(report, target);
if (yieldRate > 0) {
reportProcessor.addReportProgressListener(new YieldReportListener(yieldRate));
}
reportProcessor.processReport();
reportProcessor.close();
outputStream.flush();
result = true;
} catch (ReportProcessingException e) {
} catch (IOException e) {
}
return result;
}
protected boolean writeRtf(final MasterReport report, final OutputStream outputStream, final int yieldRate) {
boolean result = false;
try {
final StreamRTFOutputProcessor target = new StreamRTFOutputProcessor(report.getConfiguration(), outputStream, report.getResourceManager());
final StreamReportProcessor proc = new StreamReportProcessor(report, target);
if (yieldRate > 0) {
proc.addReportProgressListener(new YieldReportListener(yieldRate));
}
proc.processReport();
proc.close();
outputStream.close();
result = true;
} catch (ReportProcessingException e) {
} catch (IOException e) {
}
return result;
}
protected boolean writeXml(final MasterReport report, final OutputStream outputStream) {
boolean result = false;
try {
final XMLProcessor processor = new XMLProcessor(report);
final OutputStreamWriter writer = new OutputStreamWriter(outputStream);
processor.setWriter(writer);
processor.processReport();
writer.close();
result = true;
} catch (ReportProcessingException e) {
error(Messages.getInstance().getString("JFreeReportXmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT"), e); //$NON-NLS-1$
} catch (IOException e) {
error(Messages.getInstance().getString("JFreeReportXmlComponent.ERROR_0046_FAILED_TO_PROCESS_REPORT"), e); //$NON-NLS-1$
}
return result;
}
protected boolean writeSwingPreview(final MasterReport report) {
final ModifiableConfiguration reportConfiguration = report.getReportConfiguration();
final boolean progressBar = getInputBooleanValue(AbstractJFreeReportComponent.REPORTSWING_PROGRESSBAR,
"true".equals(reportConfiguration.getConfigProperty(JFreeReportComponent.PROGRESS_BAR_ENABLED_KEY)));//$NON-NLS-1$
final boolean progressDialog = getInputBooleanValue(AbstractJFreeReportComponent.REPORTSWING_PROGRESSDIALOG,
"true".equals(reportConfiguration.getConfigProperty(JFreeReportComponent.PROGRESS_DIALOG_ENABLED_KEY)));//$NON-NLS-1$
reportConfiguration.setConfigProperty(JFreeReportComponent.PROGRESS_DIALOG_ENABLED_KEY, String
.valueOf(progressDialog));
reportConfiguration.setConfigProperty(JFreeReportComponent.PROGRESS_BAR_ENABLED_KEY, String.valueOf(progressBar));
final PreviewDialog dialog = createDialog(report);
final ReportController reportController = getReportController();
if (reportController != null) {
dialog.setReportController(reportController);
}
dialog.pack();
if (dialog.getParent() != null) {
RefineryUtilities.centerDialogInParent(dialog);
} else {
RefineryUtilities.centerFrameOnScreen(dialog);
}
dialog.setVisible(true);
return true;
}
private ReportController getReportController() {
if (isDefinedInput(AbstractJFreeReportComponent.REPORTSWING_REPORTCONTROLLER)) {
final Object controller = getInputValue(AbstractJFreeReportComponent.REPORTSWING_REPORTCONTROLLER);
if (controller instanceof ReportController) {
return (ReportController) controller;
}
}
return null;
}
private PreviewDialog createDialog(final MasterReport report) {
final boolean modal = getInputBooleanValue(AbstractJFreeReportComponent.REPORTSWING_MODAL, true);
if (isDefinedInput(AbstractJFreeReportComponent.REPORTSWING_PARENTDIALOG)) {
final Object parent = getInputValue(AbstractJFreeReportComponent.REPORTSWING_PARENTDIALOG);
if (parent instanceof Dialog) {
return new PreviewDialog(report, (Dialog) parent, modal);
} else if (parent instanceof Frame) {
return new PreviewDialog(report, (Frame) parent, modal);
}
}
final PreviewDialog previewDialog = new PreviewDialog(report);
previewDialog.setModal(modal);
return previewDialog;
}
}